// 用于调试的 Boost.Asio 示例
#include <boost/asio.hpp>
#include <iostream>
#include <memory>

// 使用 steady_timer 而不是 deadline_timer 以避免对 boost_date_time 的深度依赖
class TimerHandler {
public:
    explicit TimerHandler(boost::asio::io_context& io_context) 
        : timer_(io_context), counter_(0) {
        std::cout << "TimerHandler 构造函数被调用" << std::endl;
    }
    
    void start() {
        std::cout << "开始异步定时器操作..." << std::endl;
        schedule_next_timeout();
    }
    
private:
    void schedule_next_timeout() {
        std::cout << "设置定时器，计数器: " << counter_ << std::endl;
        
        // 设置1秒超时
        timer_.expires_after(std::chrono::seconds(1));
        
        // 异步等待，使用lambda捕获this指针
        timer_.async_wait([this](const boost::system::error_code& error) {
            this->handle_timeout(error);
        });
        
        std::cout << "异步等待已设置" << std::endl;
    }
    
    void handle_timeout(const boost::system::error_code& error) {
        if (!error) {
            ++counter_;
            std::cout << "定时器触发! 计数: " << counter_ << std::endl;
            
            // 如果还没到5次，继续设置下一个定时器
            if (counter_ < 5) {
                schedule_next_timeout();
            } else {
                std::cout << "所有定时器完成，程序即将结束" << std::endl;
            }
        } else {
            std::cout << "定时器错误: " << error.message() << std::endl;
        }
    }
    
    boost::asio::steady_timer timer_;
    int counter_;
};

int main() {
    std::cout << "=== Asio 调试示例开始 ===" << std::endl;
    
    try {
        // 创建I/O上下文
        boost::asio::io_context io_context;
        std::cout << "io_context 已创建" << std::endl;
        
        // 创建TimerHandler
        TimerHandler handler(io_context);
        std::cout << "TimerHandler 已创建" << std::endl;
        
        // 开始异步操作
        handler.start();
        
        std::cout << "即将调用 io_context.run()..." << std::endl;
        
        // 运行事件循环
        io_context.run();
        
        std::cout << "io_context.run() 已完成" << std::endl;
        
    } catch (std::exception& e) {
        std::cerr << "异常: " << e.what() << std::endl;
        return 1;
    }
    
    std::cout << "=== 程序正常结束 ===" << std::endl;
    return 0;
}